package org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.helpers;

import org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.core.JavacupHelper;
import org.javahispano.javacup.tacticas_aceptadas.PeterEvans.TheGuarrosFromSwaziland.net.pedroferrera.javacup.core.Utils;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;

/**
 * 
 * @author Peter Evans
 *
 */
public class PorteroHelper extends JavacupHelper<Comando> {
	
	public final static int LIMITE_ACTIVACION_PORTERO_ADHOC = 25;
	public final static int LIMITE_IR_A_PELOTA_PORTERO_ADHOC = 5;
	
	protected int limiteIrAPelotaPortero = 5;
	protected int limiteActivacionPortero = LIMITE_ACTIVACION_PORTERO_ADHOC;
	
	double prevX = 0;
	double prevY = 0;
	
	public PorteroHelper() {
		
	}
	
	public PorteroHelper(int limiteActivacionPortero) {
		this.limiteActivacionPortero = limiteActivacionPortero;
	}
	
	public int getLimiteIrAPelotaPortero() {
		return limiteIrAPelotaPortero;
	}

	public void setLimiteIrAPelotaPortero(int limiteIrAPelotaPortero) {
		this.limiteIrAPelotaPortero = limiteIrAPelotaPortero;
	}

	public int getLimiteActivacionPortero() {
		return limiteActivacionPortero;
	}

	public void setLimiteActivacionPortero(int limiteActivacionPortero) {
		this.limiteActivacionPortero = limiteActivacionPortero;
	}

	@Override
	public Comando help(SituacionPartido sp, int... jugadores) {
		Comando cm = null;
		/*
		 * El portero se mueve con la recta que va al centro de la porteria
		 */
		if(sp.balon().getY() - Constantes.centroArcoInf.getY() > limiteActivacionPortero) {
			double a = 
				(sp.balon().getY() - Constantes.centroArcoInf.getY()) / 
				(sp.balon().getX() - Constantes.centroArcoInf.getX());
			if(a < Double.MAX_VALUE) {
				double b = sp.balon().getY() - a * sp.balon().getX();
				double y = Constantes.centroArcoInf.getY() + 
					((sp.balon().getY() - Constantes.centroArcoInf.getY())/(double)10);
				double x = (y - b) / a; 
				Posicion irA = new Posicion(x, y);
				if(Utils.dentro(irA))
					cm = new ComandoIrA(0, irA);
			}
		} else {
			if(prevX != 0 && prevY != 0) {
				double pend = (sp.balon().getY() - prevY) /
					(sp.balon().getX() - prevX);
				if(pend < Double.MAX_VALUE) {
					double b = sp.balon().getY() - pend * sp.balon().getX(); 
					double y = Constantes.centroArcoInf.getY() + 2; 
					double x = (y - b) / pend;
					if(x > 0) {
						x = Math.min(x, (Constantes.LARGO_ARCO / (double)2));
					} else if(x < 0) {
						x = Math.max(x, - (Constantes.LARGO_ARCO / (double)2));					
					}
					Posicion irA = new Posicion(x, y);
					cm = new ComandoIrA(0, irA);
				}
			}
		}
		prevX = sp.balon().getX();
		prevY = sp.balon().getY();
		return cm;
	}
}
